package com.etcn.common.utils;

import java.math.BigDecimal;
import java.util.UUID;

/**
 * 数据处理
 * 
 * @author guozc
 * @date 2016-04-28
 */
public class DataUtil {

	private static final String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	private static final String numbers = "1234567890";

	/**
	 * 生成指定长度的包含大写字母和数字的随机码
	 * 
	 * @param length
	 *            长度
	 * @return 包含大写字母和数字的随机码字符串
	 */
	public static String createRandomCode(int length) {
		String randCode = "";
		for (int i = 0; i < length; i++) {
			int rand = Integer.parseInt(String.valueOf(Math.round((Math.random() * 100000000)) % 36));
			randCode += letters.substring(rand, rand + 1);
		}
		return randCode;
	}

	/**
	 * 生成指定长度的数字随机码
	 * 
	 * @param length
	 *            长度
	 * @return 包含数字的随机码字符串
	 */
	public static String createRandomNumCode(int length) {
		String randCode = "";
		for (int i = 0; i < length; i++) {
			int rand = Integer.parseInt(String.valueOf(Math.round((Math.random() * 100000000)) % 10));
			randCode += numbers.substring(rand, rand + 1);
		}
		return randCode;
	}

	/**
	 * 生成不重复8位字符串
	 * 
	 * @return 不重复8位字符串
	 */
	public static String createUniqueCode() {
		String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
				"q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
				"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
				"W", "X", "Y", "Z" };
		StringBuffer shortBuffer = new StringBuffer();
		String uuid = UUID.randomUUID().toString().replace("-", "");
		for (int i = 0; i < 8; i++) {
			String str = uuid.substring(i * 4, i * 4 + 4);
			int x = Integer.parseInt(str, 16);
			shortBuffer.append(chars[x % 0x3E]);
		}
		return shortBuffer.toString();
	}

	/**
	 * ELF算法生成不重复数字
	 * 
	 * @param str
	 *            输入字符串
	 * @return 不重复数字
	 */
	public static long createUniqueNum(String str) {
		int hash = 0;
		int x = 0;
		for (int i = 0; i < str.length(); i++) {
			// hash左移4位，把当前字符ASCII存入hash低四位。
			hash = (hash << 4) + str.charAt(i);
			// 如果最高的四位不为0，则说明字符多余7个，现在正在存第8个字符，如果不处理，再加下一个字符时，第一个字符会被移出，因此要有如下处理。
			// 该处理，如果对于字符串(a-z 或者A-Z)就会仅仅影响5-8位，否则会影响5-31位，因为C语言使用的算数移位
			// 因为1-4位刚刚存储了新加入到字符，所以不能>>28
			if ((x = (int) (hash & 0xF0000000L)) != 0) {
				hash ^= (x >> 24);
				// 上面这行代码并不会对X有影响，本身X和hash的高4位相同，下面这行代码&~即对28-31(高4位)位清零。
				hash &= ~x;
			}
		}
		// 返回一个符号位为0的数，即丢弃最高位，以免函数外产生影响。(我们可以考虑，如果只有字符，符号位不可能为负)
		return (hash & 0x7FFFFFFF);
	}

	/**
	 * 浮点型数据保留两位小数
	 * 
	 * @param f
	 * @return
	 */
	public static Float handleFloatWithTwoDecimals(Float f) {
		if (f != null) {
			BigDecimal b = new BigDecimal(f);
			f = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
		}
		return f;
	}

	/**
	 * 如果a为空时返回b，不为空则返回a
	 * 
	 * @param a
	 *            处理的值
	 * @param b
	 *            a为空时返回的值
	 * @return
	 */
	public static Integer nvlInteger(Integer a, Integer b) {
		return a == null ? b : a;
	}

	/**
	 * 保留两位小数
	 * @param val
	 * @return
	 */
	public static String keepTwoDecimals(String val) {
		BigDecimal bg = new BigDecimal(val);
		double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return String.valueOf(f1);
	}

}
